#include "ParserEntrada.h"
#include <sstream>

int ParserEntrada::ejecutar( string & nombreLlegada, string & nombreSalida, int & gradoSeparacion ){

	int siguienteOpcion;
	const char* const opcionesCortas = "f:t:d:";
	string gradoString;

	const struct option opcionesLargas[] =
	{
	  { "from",       required_argument,  NULL,   'f'},
	  { "to",    required_argument,  NULL,   't'},
	  { "degree",     required_argument,  NULL,   'd'},
	  { NULL,         0,  NULL,   0   }
	};

    while ( ( siguienteOpcion = getopt_long(argc, argv, opcionesCortas, opcionesLargas, NULL) )!= -1 )
      switch ( siguienteOpcion )
      {
      case 'f':
        nombreSalida = optarg;
        break;
      case 't':
        nombreLlegada = optarg;
        break;
      case 'd':
    	gradoString = optarg;
    	break;
      default:
      	 cerr << "Llamada incorrecta al programa\n";
      	 return ERROR;
       }

    //Casteo a entero del grado de separación
    gradoSeparacion = -1;
    istringstream iss( gradoString );
    iss >> gradoSeparacion;
    if ( (gradoSeparacion == -1) && ( !gradoString.empty() ) ){
    	cerr << "Llamada incorrecta al programa: Grado debe ser entero\n";
    	return ERROR;
    }

    if( ( !nombreSalida.empty() ) && ( !nombreLlegada.empty() ) && ( gradoString.empty() ) )
    	return CAMINO_MINIMO;

    if( ( !nombreSalida.empty() ) && ( nombreLlegada.empty() ) && ( !gradoString.empty() ) )
    	return GRADO_FIJO;

    cerr << "Llamada incorrecta al programa\n";
    return ERROR;

}

void ParserEntrada::mostrarUsoCorrecto(){
	cout << endl;
	cout << "Ejemplos de correcta utilización de las opciones del programa" << endl << endl;
	cout << "Para hallar el grado de separación entre dos personas" << endl;
	cout << "--from \"Kevin Bacon\" --to \"Wes Anderson\"" << endl;
	cout << "--to \"Tony Leung\" --from \"Kevin Bacon\"" << endl << endl;
	cout << "Para hallar todas las personas a un cierto grado de separación de una dada persona" << endl;
	cout << "--from \"Kevin Bacon\" --degree 2" << endl << endl;

}
